package com.cskaoyan._11polymorphic._02basic;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/10 14:48
 **/
/*
多态的访问特征:
    父子类中同名的成员(成员变量,成员方法)

    1.访问范围(.出来的范围,编译的角度)

    2.访问结果(最终运行处的结果,运行的角度)

    结论:
        访问成员变量时,无论是访问的范围还是结果都取决于引用的数据类型
        (编译看左边,运行也看左边)
        访问成员方法时候,访问的范围取决于引用的类型,运行的结果取决于所指向的具体对象的类型
        (编译看左边,运行看右边)
 */
public class Demo {
    public static void main(String[] args) {
        // 父类引用
        Father father;
        father = new Father();
        System.out.println(father.num);
        father.m();
        System.out.println("------");
        // 父类引用指向不同的子类对象
        father = new Son1();
        System.out.println(father.fatherNum);
        father.m();
        System.out.println("------");

        father = new Son2();
        System.out.println(father.fatherNum);
        father.m();
        System.out.println("------");

        father = new Son3();
        System.out.println(father.fatherNum);
        father.m();
    }
}

class Father{
    // 同名的成员变量
    int num = 1;
    int fatherNum = 2;

    // 同名的成员方法
    public void m(){
        System.out.println("Father method");
    }

}

class Son1 extends Father{
    int num = 10;
    int num1 = 100;
    // 同名方法
    public void m(){
        System.out.println("Son1 method");
    }

}
class Son2 extends Father{
    int num = 20;
    int num2 = 200;

    // 同名方法
    public void m(){
        System.out.println("Son2 method");
    }
}
class Son3 extends Father{
    int num = 30;
    int num3 = 300;

    // 同名方法
    public void m(){
        System.out.println("Son3 method");
    }
}